package club.jdiy.core.base;

import club.jdiy.core.base.domain.DBEntity;
import club.jdiy.core.base.domain.Filterable;
import club.jdiy.core.base.domain.Pager;
import org.springframework.data.repository.NoRepositoryBean;

import java.util.List;

/**
 * JDiy Dao层动态条件查询方法接口.
 *
 * @param <T>  Entity实体类
 * @param <PK> 实体类的主键类型
 * @author ziquee(子秋) QQ号:39886616 主页: http://www.jdiy.club
 * @version 20210309
 */
@NoRepositoryBean
public interface JpaDyn<T extends DBEntity<PK>, PK> extends JpaCrud<T, PK> {

    /**
     * 查询满足条件的记录条数.
     *
     * @param t 条件
     * @return int 条数
     */
    long count(T t);

    /**
     * 查询满足条件的记录条数.
     *
     * @param f 条件
     * @return int 条数
     */
    long count(Filterable f);

    /**
     * 分页列表查询.
     *
     * @param pageSize 每页显示记录数
     * @param page     当前页
     * @param t        查询条件
     * @return 带分页信息的数据列表
     */
    default Pager<T> findPager(int pageSize, int page, T t) {
        return findPager(pageSize, page, t, null, null);
    }

    /**
     * 分页列表查询.
     *
     * @param pageSize 每页显示记录数
     * @param page     当前页
     * @param f        查询条件
     * @return 带分页信息的数据列表
     */
    default Pager<T> findPager(int pageSize, int page, Filterable f) {
        return findPager(pageSize, page, f, null, null);
    }

    /**
     * 分页列表查询(按指定字段排序).
     *
     * @param pageSize 每页显示记录数
     * @param page     当前页
     * @param t        查询条件
     * @param order    排序字段  可为空，为空时按默认排序
     * @param sort     升/降序 . 值只能是 asc或desc  可为空，默认为 asc.
     * @return 带分页信息的数据列表
     */
    Pager<T> findPager(int pageSize, int page, T t, String order, String sort);

    /**
     * 分页列表查询(按指定字段排序).
     *
     * @param pageSize 每页显示记录数
     * @param page     当前页
     * @param f        查询条件
     * @param order    排序字段  可为空，为空时按默认排序
     * @param sort     升/降序 . 值只能是 asc或desc  可为空，默认为 asc.
     * @return 带分页信息的数据列表
     */
    Pager<T> findPager(int pageSize, int page, Filterable f, String order, String sort);

    /**
     * 查询出列表(取前size条).
     *
     * @param size 要查询返回的记录条数.
     * @param t    查询条件
     * @return 查询到的记录列表.
     */
    @SuppressWarnings("unused")
    default List<T> findList(int size, T t) {
        return findList(size, t, null, null);
    }

    /**
     * 查询出列表(取前size条).
     *
     * @param size 要查询返回的记录条数.
     * @param f    查询条件
     * @return 查询到的记录列表.
     */
    @SuppressWarnings("unused")
    default List<T> findList(int size, Filterable f) {
        return findList(size, f, null, null);
    }

    /**
     * 查询出列表(以指定的字段排序，取前size条).
     *
     * @param size  要查询返回的记录条数.
     * @param t     查询条件
     * @param order 排序字段  可为空，为空时按默认排序
     * @param sort  升/降序 . 值只能是 asc或desc  可为空，默认为 asc.
     * @return 查询到的记录列表.
     */
    List<T> findList(int size, T t, String order, String sort);

    /**
     * 查询出列表(以指定的字段排序，取前size条).
     *
     * @param size  要查询返回的记录条数.
     * @param f     查询条件
     * @param order 排序字段  可为空，为空时按默认排序
     * @param sort  升/降序 . 值只能是 asc或desc  可为空，默认为 asc.
     * @return 查询到的记录列表.
     */
    List<T> findList(int size, Filterable f, String order, String sort);
}
